A computer program can be viewed as a detailed plan or procedure for solving a problem with a computer: an ordered sequence of computational instructions necessary to achieve such a solution. The distinction between computer programs and equipment is often made by referring to the former as software and the latter as hardware. An operating system (OS) is a set of programs that controls the interaction between applications and hardware. The OS also controls the interaction between different applications.
In conventional computer systems, the OS provides generalized system services to application programs, such as utility and daemon programs. These system services conventionally include access to hardware peripheral devices attached directly or indirectly to the computer system. A variety of different schemes exist for implementing OSes, but most include a kernel and module architecture. The kernel contains the most heavily used portions of the operations system, such as process management and handling of device interupts. Modules, however, contain portions of the operating system that are not used as frequently, for example, device drivers specific to hardware and libraries specific to certain applications. However, the definitions of the kernel and modules are open to interpretation, and different types of OSes include different elements in the kernels and modules. For example, in an OS based on a monolithic kernel, the kernel contains virtually the complete operating system, including scheduling, file systems, device drivers, and memory management. However, in an OS based on a microkernel, only a few essential functions are assigned to the kernel, while other OS processes are provided by modules that execute on the kernel.
To form a functioning OS, the modules are integrated into the kernel. This is sometimes known as a build. The OS is then stored in binary format, known as an image, on a memory device, such as a hard drive. For example, in Linux, a Unix based OS, the OS is generated by forming a configuration file, setting all the source dependencies, compiling source code files into object files, and then linking the object files to form an image.
Applications that execute on the OS may require device drivers, which are used to provide an interface to the hardware on the system. APIs (application program interfaces) are used for compatibility between a particular application and the OS. Both device drivers and APIs can be implemented as modules. Applications may also require specific modules in order to function, for example, a math application could require a module that contains trigonometric functions.
Since different applications may require different modules, configuration tools are used to configure an OS for a particular application. The configuration tools verify that the operating system is coherent and fits the application needs. For example, the configuration tools may verify that all the modules that the application needs are present and properly initialized.
One way that configuration tools verify the operating system is by a dependency analysis. A dependency analysis finds all the dependancies between modules of an OS and a particular application. Dependency analysis works by symbol analysis and explicit dependence. Symbol analysis finds undefined symbols in application object files. Explicit dependence analyzes a file that states which second components should be included if a first component is included. For example, a component descriptor file may state that if component Y is included, then component X is also included.
An example of a configuration tool that uses a dependency analysis is the project tool in Tornado™ 2.0. The project tool works by verifying that a set of files (e.g., application files and BSP files), an OS configuration (e.g., a list of components and their parameters), and a set of build specification (e.g., parameters used during the build phase) are correct for a particular application. The verification procedure uses a dependency analysis where the dependencies are expressed in terms of components. A component is a logical set of modules. For example, if a symbol is used by an application and is defined in a module, then the corresponding component is included in the OS.
However, the project tool works for one OS. Thus, to develop a project on more than one OS requires a separate project for each OS. For example, if a user wants develop an application on VxWorks® 5.4 for later use on VxWorks®/Cert, the user configures VxWorks® 5.4 and then VxWorks®/Cert for the application. The user can then develop the application on the VxWorks® 5.4 and then switch to the VxWorks®/Cert to test it. If the user then wants to debug the application or develop it further, the user switches back to VxWorks® 5.4. This results in substantial expenditures of money, time, and computing resources.